<?php
/**
 * Implemente un bloc html
 * 
 * Cette classe sert a retourner ce genre de bloc:
 * <balise att1='att1' att='att2'>
 *   contenu
 * </balise>
 */
class BphItemBox extends BphItem{
	/**
	 * array: Le contenu de la balise (string ou BphItem)
	 */
	public $_items = Array();
	
	/**
	 * Boolean: Flag indique si le contenu est sur la meme ligne
	 */
	public $raw = FALSE;
	
	
	/**
	 * Boolean: Flag indique si le contenu texte doit etre affiché sans echappement
	 */
	public $plain_content = FALSE;
	
	/**
	 * Constructeur de la classe
	 * @param string	$pbalise	@link $_balise
	 */
	function __Construct ($pbalise) {
		parent::__Construct($pbalise);
		$this->_items = Array();
		$this->raw = FALSE;
		$arg_list = func_get_args();
		
		array_shift($arg_list);
		$this->AddItems($arg_list);
	}
	
	/**
	 * Ajoute un seul item au contenu
	 */
	function AddOneItems($item){
		$this->_items[] = $item;
	}
	
	/**
	 * Ajoute * items au contenu de la balise
	 */	
	function AddItems (){
		$num_args = func_num_args();
		$arg_list = func_get_args();
		foreach ( $arg_list as $arg ){
			if ( is_array($arg) ){
				foreach ( $arg as $item){
					$this->AddItems($item);
				}
			}
			else {
				$this->AddOneItems($arg);
			}
		}
	}
	
	/**
	 * Renvoie le nombre d'items contenu
	 */	
	function NumItems(){
		return count($this->_items);
	}
	
	/**
	 * Renvoie le code html (sans les balises de cet objet)
	 */	
	function InnerCode ($level=0, $indent=TRUE, $line=TRUE) {
		$code = '';
		foreach($this->_items as $item){
			if ($item instanceof BphItem){
				$code .= $item->Code($level,$this->raw);
			}
			else{
				if ($this->plain_content)
					$text = $item;
				else
					$text = htmlspecialchars($item);
				$code .= $this->_StrLine($level, $text, $indent, $line, $this->plain_content);
			}
		}
		return $code;
	}
	
	/**
	 * Renvoie le code html complet de cet objet
	 */	
	function Code ($level=0, $pparentraw=FALSE) {
		// line: flag retour a la ligne apres le contenu
		$line = !$this->raw;
		// indent: flag indentation avant le contenu
		$indent = !$this->raw;
		$attribut = $this->_StrAttribut();
		$code = $this->_StrLine($level, "<{$this->_balise}$attribut>", !$pparentraw, $line);
		$code .= $this->InnerCode($level+1, $indent, $line);
		$code .= $this->_StrLine($level, "</{$this->_balise}>", $indent, !$pparentraw);
		return $code;
	}
}// class BphItemBox

class BphEmpty extends BphItemBox{
	function __Construct () {
		parent::__Construct('');
	}
	function Code ($level=0, $pparentraw=FALSE) {
		return parent::InnerCode($level);
	}
}
?>
